﻿/* Autor: Achim Schnell */

using System;

namespace AppFx.ComponentModel
{
	/// <summary>
	/// Ein Attribut, dass angibt, ob die Eigenschaften eines Members durchsucht werden dürfen.
	/// </summary>
	[AttributeUsage(AttributeTargets.All)]
	public class ExpandableAttribute : Attribute
	{
		#region Statics

		/// <summary>Gibt an, dass die Eigenschaften eines Members durchsucht werden dürfen. Dieses static-Feld ist schreibgeschützt.</summary>
		public static readonly ExpandableAttribute Yes = new ExpandableAttribute(true);
		/// <summary>Gibt an, dass die Eigenschaften eines Members nicht durchsucht werden dürfen. Dieses static-Feld ist schreibgeschützt.</summary>
		public static readonly ExpandableAttribute No = new ExpandableAttribute(false);
		/// <summary>Gibt den Standardwert für das <see cref="T:AppFx.ComponentModel.ExpandableAttribute" /> an, der <see cref="F:AppFx.ComponentModel.ExpandableAttribute.Yes" /> ist. Dieses static-Feld ist schreibgeschützt.</summary>
		public static readonly ExpandableAttribute Default = ExpandableAttribute.Yes;

		#endregion

		#region Fields

		private bool expandable = true;

		#endregion

		#region Properties
		
		/// <summary>Ruft einen Wert ab, der angibt, ob die Eigenschaften des Members durchsucht werden dürfen.</summary>
		/// <returns>true, wenn die Eigenschaften untersucht werden dürfen, andernfalls false.</returns>
		public bool Expandable
		{
			get
			{
				return this.expandable;
			}
		}

		#endregion

		#region Constructors


		/// <summary>Initialisiert eine neue Instanz der <see cref="T:AppFx.ComponentModel.ExpandableAttribute"/>-Klasse.</summary>
		/// <param name="expandable">true, wenn die, andernfalls false. Der Standardwert ist true.</param>
		public ExpandableAttribute(bool expandable)
		{
			this.expandable = expandable;
		}

		#endregion

		#region Methods

		/// <summary>Gibt an, ob diese Instanz und ein angegebenes Objekt gleich sind.</summary>
		/// <returns>true, wenn <paramref name="obj" /> gleich dieser Instanz ist, andernfalls false.</returns>
		/// <param name="obj">Ein weiteres Objekt für den Vergleich. </param>
		public override bool Equals(object obj)
		{
			if (obj == this)
			{
				return true;
			}
			ExpandableAttribute browsableAttribute = obj as ExpandableAttribute;
			return browsableAttribute != null && browsableAttribute.Expandable == this.expandable;
		}
		/// <summary>Gibt den Hashcode für diese Instanz zurück.</summary>
		/// <returns>Ein 32-Bit-Ganzzahl-Hashcode mit Vorzeichen.</returns>
		public override int GetHashCode()
		{
			return this.expandable.GetHashCode();
		}
		/// <summary>Bestimmt, ob dieses Attribut der Standardwert ist.</summary>
		/// <returns>true, wenn das Attribut der Standardwert für diese Attributklasse ist, andernfalls false.</returns>
		public override bool IsDefaultAttribute()
		{
			return this.Equals(ExpandableAttribute.Default);
		}

		#endregion
	}
}
